983 #define MATRIX_10_SIZE 10 1001 pthisMagCal->
fmatA[i][j] = 0.0F;
1005 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
1010 if (pthisMagBuffer->
index[i][j] != -1)
1013 for (k = 0; k < 3; k++)
1020 for (i = 0; i < 3; i++)
1022 if (pthisMagCal->
iSumBs[i] >= 0)
1051 i = (pthisMagCal->
itimeslice - 1) / MAGBUFFSIZEY;
1052 j = (pthisMagCal->
itimeslice - 1) % MAGBUFFSIZEY;
1053 if (pthisMagBuffer->
index[i][j] != -1)
1056 for (k = 0; k < 3; k++)
1057 pthisMagCal->
fvecA[k + 6] = (
float)
1059 (
int32) pthisMagBuffer->
iBs[k][i][j] -
1064 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1065 pthisMagCal->
fvecA[1] = 2.0F *
1066 pthisMagCal->
fvecA[6] *
1067 pthisMagCal->
fvecA[7];
1068 pthisMagCal->
fvecA[2] = 2.0F *
1069 pthisMagCal->
fvecA[6] *
1070 pthisMagCal->
fvecA[8];
1071 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1072 pthisMagCal->
fvecA[4] = 2.0F *
1073 pthisMagCal->
fvecA[7] *
1074 pthisMagCal->
fvecA[8];
1075 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1079 for (k = 0; k < 6; k++)
1080 pthisMagCal->
fmatA[k][9] += pthisMagCal->
fvecA[k];
1083 for (k = 0; k < (MATRIX_10_SIZE - 1); k++)
1085 for (l = k; l < (MATRIX_10_SIZE - 1); l++)
1086 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
1096 else if (pthisMagCal->
itimeslice == (MAGBUFFSIZEX * MAGBUFFSIZEY + 1))
1099 pthisMagCal->
fmatA[MATRIX_10_SIZE - 1][MATRIX_10_SIZE - 1] = (float) pthisMagBuffer->
iMagBufferCount;
1106 for (j = 0; j < i; j++)
1107 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
1113 pthisMagCal->
fmatB[i][j] = 0.0F;
1114 pthisMagCal->
fmatB[i][i] = 1.0F;
1115 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1126 else if ((pthisMagCal->
itimeslice >= (MAGBUFFSIZEX * MAGBUFFSIZEY + 2)) &&
1127 (pthisMagCal->
itimeslice <= (MAGBUFFSIZEX * MAGBUFFSIZEY + 46)))
1130 k = pthisMagCal->
itimeslice - (MAGBUFFSIZEX * MAGBUFFSIZEY + 2);
1178 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1180 pthisMagCal->
fvecA, i, j, MATRIX_10_SIZE);
1188 else if (pthisMagCal->
itimeslice == (MAGBUFFSIZEX * MAGBUFFSIZEY + 47))
1194 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
1197 if (fresidue > 0.0F)
1199 (pthisMagCal->
itimeslice) = MAGBUFFSIZEX * MAGBUFFSIZEY + 2;
1207 else if (pthisMagCal->
itimeslice == (MAGBUFFSIZEX * MAGBUFFSIZEY + 48))
1215 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
1230 fdetA = fabs(fdetA);
1232 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
1239 for (i =
CHX; i <=
CHZ; i++)
1241 pthisMagCal->
ftrV[i] = pthisMagCal->
finvA[i][0] *
1242 pthisMagCal->
fmatB[6][imin] +
1243 pthisMagCal->
finvA[i][1] *
1244 pthisMagCal->
fmatB[7][imin] +
1245 pthisMagCal->
finvA[i][2] *
1246 pthisMagCal->
fmatB[8][imin];
1247 pthisMagCal->
ftrV[i] *= -0.5F;
1261 ftmp -= pthisMagCal->
fmatB[9][imin];
1262 ftmp += pthisMagCal->
fA[
CHX][
CHX] *
1265 ftmp += pthisMagCal->
fA[
CHY][
CHY] *
1268 ftmp += pthisMagCal->
fA[
CHZ][
CHZ] *
1271 pthisMagCal->
ftrB = sqrtf(fabsf(ftmp));
1275 pthisMagCal->
fvecA[imin] /
1277 )) / (pthisMagCal->
ftrB * pthisMagCal->
ftrB);
1283 for (i =
CHX; i <=
CHZ; i++)
1284 pthisMagCal->
ftrV[i] =
1286 pthisMagCal->
ftrV[i] +
1287 (
float) pthisMagCal->
iMeanBs[i]
1292 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
1298 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
1303 for (i = 0; i < 3; i++)
1305 for (j = 0; j < 3; j++)
1307 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1308 pthisMagCal->
fmatB[i][j] = 0.0F;
1311 pthisMagCal->
fmatB[i][i] = 1.0F;
1312 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1322 else if ((pthisMagCal->
itimeslice >= (MAGBUFFSIZEX * MAGBUFFSIZEY + 49)) &&
1323 (pthisMagCal->
itimeslice <= (MAGBUFFSIZEX * MAGBUFFSIZEY + 51)))
1326 k = pthisMagCal->
itimeslice - (MAGBUFFSIZEX * MAGBUFFSIZEY + 49);
1344 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1346 pthisMagCal->
fvecA, i, j, 3);
1354 else if (pthisMagCal->
itimeslice == (MAGBUFFSIZEX * MAGBUFFSIZEY + 52))
1358 fresidue = fabsf(pthisMagCal->
fmatA[0][1]) + fabsf(pthisMagCal->
fmatA[0][2]) + fabsf(pthisMagCal->
fmatA[1][2]);
1359 if (fresidue > 0.0F)
1361 (pthisMagCal->
itimeslice) = MAGBUFFSIZEX * MAGBUFFSIZEY + 49;
1369 else if (pthisMagCal->
itimeslice == (MAGBUFFSIZEX * MAGBUFFSIZEY + 53))
1372 for (j = 0; j < 3; j++)
1374 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1375 for (i = 0; i < 3; i++)
1376 pthisMagCal->
fmatB[i][j] *= ftmp;
1382 for (i = 0; i < 3; i++)
1384 for (j = i; j < 3; j++)
1387 pthisMagCal->
fmatB[i][0] *
1388 pthisMagCal->
fmatB[j][0] +
1389 pthisMagCal->
fmatB[i][1] *
1390 pthisMagCal->
fmatB[j][1] +
1391 pthisMagCal->
fmatB[i][2] *
1392 pthisMagCal->
fmatB[j][2];
float ftrB
trial value of geomagnetic field magnitude in uT
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements)
#define CHY
Used to access Y-channel entries in various data data structures.
float fmatB[10][10]
scratch 10x10 float matrix used by calibration algorithms
int32_t iMeanBs[3]
average magnetic measurement (counts)
void f3x3matrixAeqMinusA(float A[][3])
function negates all elements of 3x3 matrix A
void f3x3matrixAeqAxScalar(float A[][3], float Scalar)
function multiplies all elements of 3x3 matrix A by the specified scalar
int8_t iNewCalibrationAvailable
flag denoting that a new calibration has been computed
int8_t iInitiateMagCal
flag to start a new magnetic calibration
int16_t iMagBufferCount
number of magnetometer readings
float f3x3matrixDetA(float A[][3])
function calculates the determinant of a 3x3 matrix
float ftrV[3]
trial value of hard iron offset z, y, z (uT)
float ftrinvW[3][3]
trial inverse soft iron matrix size
int32_t iSumBs[3]
sum of measurements in buffer (counts)
float fmatA[10][10]
scratch 10x10 float matrix used by calibration algorithms
float fvecA[10]
scratch 10x1 vector used by calibration algorithms
float ftrFitErrorpc
trial value of fit error %
int8_t iMagBufferReadOnly
flag to denote that the magnetic measurement buffer is temporarily read only
float fuTPerCount
uT per count
#define ONETHIRD
one third
float fA[3][3]
ellipsoid matrix A
void f3x3matrixAeqInvSymB(float A[][3], float B[][3])
function directly calculates the symmetric inverse of a symmetric 3x3 matrix only the on and above di...
void fComputeEigSlice(float fmatA[10][10], float fmatB[10][10], float fvecA[10], int8 i, int8 j, int8 iMatrixSize)
#define CHX
Used to access X-channel entries in various data data structures.
int8_t iCalInProgress
flag denoting that a calibration is in progress
float finvA[3][3]
inverse of ellipsoid matrix A
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements)
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
int32_t itimeslice
counter for tine slicing magnetic calibration calculations